热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

标量|大人_pytorch案例代码

篇首语:本文由编程笔记#小编为大家整理,主要介绍了pytorch案例代码相关的知识,希望对你有一定的参考价值。学习于刘二大人课程

篇首语:本文由编程笔记#小编为大家整理,主要介绍了pytorch案例代码相关的知识,希望对你有一定的参考价值。


学习于刘二大人课程



最简单的线性回归

这里MSELoss是求均方误差的,其用来反应估计量与被估计量之间差异程度。

定义优化器中传入的第一个参数model.parameters()是为了告诉优化器哪些tensor需要去梯度下降来优化的,这个parameters会检查model里的所有成员,如果这些成员里有相应的权重,就都会把它们加入到训练的结果里,这里的model里只有一个linear的w和b。





最简单的逻辑斯蒂回归(softmax)(二分类)
improt torch.nn.functional as F

这里BCELoss是二值交叉熵损失的,适用于0/1二分类。





多维数据多层神经元网络逻辑斯蒂回归(二分类)

gz是linux中压缩文件格式,loadtxt可以读csv也可以读csv.gz。
这里读取数据类型写成np.float32不写成double是因为大部分GPU只支持32位浮点数。
读取y数据的列切片要写成[-1]而不是-1因为我们希望拿出来的是矩阵而不是向量,torch的运算支持广播,矩阵运算比标量运算要快得多。

初始化函数中sigmoid的定义不同于之前的torch.nn.functional.sigmoid,这里是继承自module的。
forward的定义里一直用x变量是默认写法。





加载数据集
在mini-batch中,batch-size就是字面意思,Iteration等于样本总数除以batch-size。

需要用到俩个库,第一个是Dataset,用来构造数据集,数据集支持索引访问(下标),其是一个抽象类,即不能实例化,需要我们定义一个继承它的类才能实例化一个对象使用。定义这个类的init()时,针对数据集的大小有俩种定义方法,因为数据太大时不可能一次性读入内存,当读取的数据非常大时,比如可以采用以下方法:只是在init里定义一个列表存储数据集每一个数据的文件名,标签如果太大也可以采用这种方法,然后可以等到getitem里面再根据读写第i个文件根据列表的文件名再把它读进来,保证内存的高效使用。

DataLoader用于拿出mini-batch,可以实例化。

因为win和linux库函数的不同,直接调用含多线程(num_workers=2)的DataLoader实例化对象会报错,把它封装到一个if或者一个函数里就不会报错了。


定义Dataset读取全部数据的版本,xy.shape()返回数据集二维矩阵的行数和列数,这里我们取样本个数即行数。


从train_loader获得xy的mini数据data,再将data赋值给inputs、lables分别对应x和y。这里一个inputs就是一个batch-size大小的x数据的张量。

上面写的读入全部数据版本的完整代码如下:




datasets内置数据集


这里直接用MIST构造数据,不需要Dataset。
transform=transforms.ToTensor()表示数据要做怎样的变换,这里因为datasets里拿出来的数据是用Pillow读出来的,所以需要转换成张量,过程中会有一定的操作比如说图像像素值255缩放到0-1或-1到1。
这里测试的时候没有设置shuffle,因为测试的时候对模型没有改变,不需要打乱,且能保证每次输出测试样本的预测的顺序和输出样本数据序列保持一致便于观察。
最下面的循环省略了外层的epoch循环。





多分类问题
训练好的模型仅仅使用softmax来预测概率是可以的,但是优化的时候需要将softmax的结果取对数等计算来计算交叉熵,以此计算与真实标签的差距有多大,所以训练的时候需要计算交叉熵,交叉熵反应了预测值与真实标签之间的差异程度,且具有一些较好的性质。使用交叉熵时注意最后一层就不要使用激活函数了,直接传入进行计算。
pytorch提供求多分类的交叉熵损失函数(前面的BCE是二分类),把从softmax然后求对数等操作(NLLLoss)集成到一个接口,即CrossEntropyLoss。
在计算交叉熵时传入的y需要是LongTensor,即长整形张量。



这里使用MNIST中28×28的数字图像分类作为例子。有一些常用的库。

读入的图像要转成Tensor把28×28×1转为1×28×28,然后根据MNIST的均值和标准差把像素值归一化,因为0-1的数据对神经网络来说训练效果更好。


网络层中的x=x.view(-1,784),-1代表自动识别样本个数,784表示将28×28的图像拼接成一个784的向量,得到的x为N×784的矩阵张量。
这里注意最后一层直接返回l5(x)不做激活,因为要传入交叉熵做softmax。

因为网络模型有点大了,用更好的优化算法,这里SGD+动量版本。

为了更好分离训练和测试,这里演示把一轮训练封装成函数的写法。

下面是一次测试的函数。测试不需要反向传播,写了torch.no_grad下面的代码就不会计算梯度了。
拿完数据传入模型做预测,预测完后拿到的结果矩阵每一行有十个量代表每个的预测值,我们需要拿到每一行的最大值下标是多少对应其分类,这里用到torch.max函数,这里可以指定沿着维度1即每行找最大值的下标(维度0是沿着每列),但是它返回俩个值,第一个是每行的最大值是多少,我们不需要所以传给变量_,下标传给predicted。
最后计算正确预测样本数和样本数计算正确率。

有了以上将来训练十轮就可以写成下面形式。也可以if epoch%10==9,十轮测试一次





卷积神经网络
batch表示样本个数。第一个卷积层第一个参数1表示输入通道数,这里输入图片是灰度图所以为1,第二个参数表示输出通道,这里为10,表示这层有10个1×28×28的卷积核。kernel_size为5表示卷积核长宽为5,当然这个参数也可以传入元组用长宽不同的卷积核但一般不这么做。
第三层为池化层,传入2表示2×2的卷积核来池化,不指定stride默认stride为卷积核大小。这里没有涉及权重,不用定义多个,复用一个即可。

观察forward,可以先用数据求得n,即batch_size;这里先做第一次卷积然后池化然后RELU,然后再第二次卷积然后池化然后RELU与左边图片顺序有点不同问题不大。
最后要做一次view将20×4×4展开成320,再做全连接降为10维就和类别对应上,就可以扔进交叉熵获得损失做训练了。

将这些代码改到上个多分类版本中的代码中,其他的不用改,卷积网络就搭建好了。





TIPS:如何使用GPU来训练

在实例化model后加上这些语句,如果有多个显卡,还可以指定用哪个显卡:cuda:i,不同任务用不同显卡。然后不仅模型要迁移到GPU,计算的张量也要迁移进去,注意模型和数据要放到同一块显卡:

测试时也加入,就行了:







高级卷积之GoogleNet
目前常用的基础模块,经常在其基础上修改完成任务。画红线的部分都是一样的模块,称为一个Inception。

一个Inception如下所示,灵感来源于不知道卷积网络中使用什么样大小的卷积核合适,那么在一个Inception中使用多个大小的卷积核,那么效果好的卷积核在训练中权重也会越来越大,也就是给模型多了几条备选路径。
上下的Concatenate是各个张量拼接到一块,分成四个路径所以最后再拼接的时候要保证长宽一致,那么在不同卷积核卷积过程中要使用指定的padding、卷积核数量和池化类型。
为什么有那么多1×1的卷积?因为需要拿它们来改变输入张量通道数,而1×1的卷积能保证计算量大大减少


代码:

把张量拼接到一起,其中维度指定为1是因为张量的维度顺序是(batch,channel,width,height),我们要沿着通道拼接起来。

最后整合以上代码如下:

这里的1408、88等就是根据经过一些神经网络之后输出的有多少个元素多少个channel,这些值我们有时候也不需要自己去算,为了防止自己算的数目不对导致代码出错,定义这些模块的时候可以把最后俩行等先去掉,先根据它的输入构造一个像MNIST这样随机大小的张量输入,然后让模型算一次,然后看看输出的size是多少,这些值就可以求出来了,直接让机器去求就完了。

最后我们实际上在写代码的时候,发现某一次测试集准确率达到新高点,我们可以对当前网络的参数做一个备份存盘,也可以为了防止代码跑崩丢失模型使用存参数或者存模型的方法。







高级卷积之残差网络
对x求梯度,最低也是在梯度1的基础上加f对x的梯度,解决了梯度消失问题。
这里是Fx+x之后再做激活。
为了能让Fx和x相加,要保证中间俩层卷积层的输入和输出长宽和通道相同,即x和Fx的通道数、长宽完全一样。

构造好ResidualBlock,就可以写网络了:

针对以上,如果以后有各种稀奇古怪的网络结构,可以嵌套的用类封装它们。





TIPS:刘二大人的学习建议





循环神经网络
适合前后有联系的连续数据预测,比如天气预测、股市预测、自然语言等,而这些用DNN、CNN来做计算量就太大或者没法做,h0是先验,也可以前面接上CNN+FC后面连上RNN,就可以完成图像到文本的转换,没有先验时h0也可以设为和h1同维度的全0。
注意RNN Cell是共享的,所有的RNN Cell都是同一个Linear(线性层),循环使用。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 读手语图像识别论文笔记2
    文章目录一、前言二、笔记1.名词解释2.流程分析上一篇快速门:读手语图像识别论文笔记1(手语识别背景和方法)一、前言一句:“做完了&#x ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 建立分类感知器二元模型对样本数据进行分类
    本文介绍了建立分类感知器二元模型对样本数据进行分类的方法。通过建立线性模型,使用最小二乘、Logistic回归等方法进行建模,考虑到可能性的大小等因素。通过极大似然估计求得分类器的参数,使用牛顿-拉菲森迭代方法求解方程组。同时介绍了梯度上升算法和牛顿迭代的收敛速度比较。最后给出了公式法和logistic regression的实现示例。 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
author-avatar
股民连长
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有